package com.iaz.tech.tools.common.utils;

/**
 * 接口类
 * @param <T>
 */
public interface IChainListAble<T>{
    
    
    /**
     * 获得整个链表的尺寸
     * @return
     */
    int size();    
    /**
     * 执行开始
     * @return
     */
    IChainNodeAble<T> first();

    /**
     * 获得执行最后一个计划
     * @return
     */
    IChainNodeAble<T> end();

    /**
     * 从当前游标，跳动到指定步长位置，大于0为next, 小于0为prev
     * @return
     */
    IChainNodeAble<T> skip(long _post);
    /**
     * 将当前游标，移动到从头到position 的位置
     * @param _post
     * @return
     */
    IChainNodeAble<T> position(long position);

    /**
     * 增加当前列表的尾部
     * @param _new_chain_data 新的链表成员
     * @return
     */
    IChainNodeAble<T> append(T _new_chain_data);
    /**
     * 在当前位置增加
     * @param _new_chain_node
     * @return
     */
    IChainNodeAble<T> appendChainNode(IChainNodeAble<T> _new_chain_node);

    /**
     * 先移动指定职位，在进行处理
     * @param _post
     * @param _new_chain_data
     * @return
     */
    IChainNodeAble<T> append(long _post, T _new_chain_data);
    IChainNodeAble<T> appendChainNode(long _post, IChainNodeAble<T> _new_chain_node);
    /**
     * 链表最末尾添加
     * @param _post
     * @param _new_chain_data
     * @return
     */
    IChainNodeAble<T> appendTail(T _new_chain_data);
    IChainNodeAble<T> appendTailChainNode(IChainNodeAble<T> _new_chain_node);
    /**
     * 在链表头，添加
     * @param _new_chain_data
     * @return
     */
    IChainNodeAble<T> appendHeader(T _new_chain_data);
    IChainNodeAble<T> appendHeaderChainNode(IChainNodeAble<T> _new_chain_node);
    /**
     * 插入
     * @param _new_chain_data 新的链表成员
     * @return
     */
    IChainNodeAble<T> insert(T _new_chain_data);
    IChainNodeAble<T> insertChainNode(IChainNodeAble<T> _new_chain_node);

    /**
     * 移动到指定位置后，在cursor 成员前插入新成员
     * @param _post
     * @param _new_chain_data 新的链表成员
     * @return
     */
    IChainNodeAble<T> insert(long _post, T _new_chain_data);
    IChainNodeAble<T> insertChainNode(long _post, IChainNodeAble<T> _new_chain_node);
    
    /**
     * 移动到指定位置后，在cursor 成员前插入新成员
     * @param _post
     * @param _new_chain_data 新的链表成员
     * @return
     */
    IChainNodeAble<T> insertHeader(T _new_chain_data);
    IChainNodeAble<T> insertHeaderChainNode(IChainNodeAble<T> _new_chain_node);
    /**
     * 移动到指定位置后(链表末尾)，在cursor 成员前插入新成员
     * @param _post
     * @param _new_chain_data 新的链表成员
     * @return
     */
    IChainNodeAble<T> insertTail(T _new_chain_data);
    IChainNodeAble<T> insertTailHeaderChainNode(IChainNodeAble<T> _new_chain_node);
    /**
     * 删除自己，此操作，容易丢失链条
     * @return
     */
    T delete();
    /**
     * 删除指定位置的链表，并返回值
     * @param post
     * @return
     */
    T delete(int post);
    /**
     * 删除全部链条
     */
    void clear();
    /**
     * 是否有下一个
     * @return
     */
    boolean hasCursorNext();
   
    IChainNodeAble<T> nextCursor();
    IChainNodeAble<T> prevCursor();
    
    boolean isCursorTail();
    boolean isCursorHeader();
}
